package com.xxxtea.config.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.xxxtea.common.BaseEnum;

/**
 * EasyExcel-枚举类转换器
 * 
 * 用于在使用EasyExcel进行Excel导入导出时，实现BaseEnum类型与Excel单元格字符串之间的相互转换。
 * 支持将枚举的label写入Excel，以及从Excel字符串还原为对应的枚举对象。
 * 
 * @author badman
 * @since 1.0.0
 */
public class BaseEnumConverter implements Converter<BaseEnum<?>> {
	/**
	 * 支持的Java类型：BaseEnum
	 */
	@Override
	public Class<?> supportJavaTypeKey() {
		return BaseEnum.class;
	}

	/**
	 * 支持的Excel类型：字符串
	 */
	@Override
	public CellDataTypeEnum supportExcelTypeKey() {
		return CellDataTypeEnum.STRING;
	}

	/**
	 * Excel字符串转为Java枚举对象
	 * 
	 * @param cellData 单元格数据
	 * @param contentProperty 字段属性
	 * @param globalConfiguration 全局配置
	 * @return 枚举对象
	 */
	@Override
	public BaseEnum<?> convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		if (cellData.getStringValue() == null) {
			return null;
		}
		return BaseEnum.labelOf(contentProperty.getField().getType(), cellData.getStringValue());
	}

	/**
	 * Java枚举对象转为Excel字符串
	 * 
	 * @param value 枚举对象
	 * @param contentProperty 字段属性
	 * @param globalConfiguration 全局配置
	 * @return 单元格数据
	 */
	@Override
	public WriteCellData<?> convertToExcelData(BaseEnum<?> value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
		return new WriteCellData<>(value.getLabel());
	}
}